//
//  MJRefreshComponentRxSwiftExtension.swift
//  Intersection
//
//  Created by 好东家 on 2022/8/19.
//

import RxSwift
import RxCocoa
import MJRefresh
 
// MARK: - 基于MJ单独的刷新管理
//对MJRefreshComponent增加rx扩展
// ⚠️ 存在问题，使用下面 基于TableView整体的刷新管理
@MainActor
extension Reactive where Base: MJRefreshComponent {
     
    ///正在刷新事件
    public var refreshing: ControlEvent<Void> { // 将控件的刷新事件转换为 RxSwift 的 ControlEvent
        // 创建 Observable 事件源
        let source: Observable<Void> = Observable.create {
            // 弱引用捕获控件（假设 self.base 是 UIKit 控件，如 UIRefreshControl）
            [weak control = self.base] observer  in
            // 安全解包控件引用
            if let control = control {
                // 设置控件的原生刷新回调闭包
                control.refreshingBlock = {
                    // 当刷新触发时，通过 observer 发送 next 事件
                    observer.on(.next(()))
                }
            }
            // 返回清理资源的 Disposable
            return Disposables.create()
        }
        // 将 Observable 包装为 ControlEvent（专用于 UI 事件）
        return ControlEvent(events: source)
    }
    
    ///停止刷新
    public var endRefreshing: Binder<Bool> {
        // Binder 只处理next事件，且一定会在主线程执行
        return Binder(base) { refresh, isEnd in
            if isEnd {
                refresh.endRefreshing()
            }
        }
    }
}



// MARK: - 基于TableView整体的刷新管理

extension UITableView {
    ///刷新状态
    public enum refreshState {
        ///结束所有刷新
        case endAll
        /// 开始下拉刷新
        case beHeader
        ///下拉刷新完成
        case endHeader
        /// 开始上拉加载
        case beFotter
        ///上拉加载完成
        case endFooter
        ///上拉加载无更多数据
        case endFooterNoMore
        /// 无状态
        case none
    }
}

@MainActor
extension Reactive where Base: UITableView {
    
    // Binder 只处理next事件，且一定会在主线程执行
    ///刷新状态
    public var refreshState: Binder<UITableView.refreshState>{
        return Binder(base) { table,refreshState in
            switch refreshState {
            case .endHeader: //下拉刷新结束
                table.mj_header?.endRefreshing()
                table.mj_footer?.resetNoMoreData()
                break
            case .endFooter: //上拉加载结束
                table.mj_footer?.endRefreshing()
                break
            case .endFooterNoMore://上拉无更多数据
                table.mj_footer?.endRefreshingWithNoMoreData()
                break
            case .endAll: //结束所有刷新
                table.mj_header?.endRefreshing()
                table.mj_footer?.endRefreshing()
            default:
                break
            }
        }
    }
    
    
}

